package handler;

import dao.CargoDao;
import dao.CidadeDao;
import dao.EstadoDao;
import dao.FuncionarioDao;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Named;
import javax.persistence.RollbackException;
import pojo.Cidade;
import pojo.Estado;
import pojo.Funcionario;

/**
 *
 * @author VALERIO
 */
@Named(value = "funcionarioHandler")
@SessionScoped
public class FuncionarioHandler implements Serializable {

    @EJB
    private FuncionarioDao funcionariodao = new FuncionarioDao();
    @EJB
    private CargoDao cargodao = new CargoDao();
    @EJB
    private CidadeDao cidadedao = new CidadeDao();
    @EJB
    private EstadoDao estadodao = new EstadoDao();
    private Funcionario funcionario = new Funcionario();
    private List<Funcionario> listafuncionario;
    private Funcionario excluido;
    private long idCargo;
    private long idCidade;
    private long idEstado;

    public FuncionarioHandler() {
    }

    public CargoDao getCargodao() {
        return cargodao;
    }

    public void setCargodao(CargoDao cargodao) {
        this.cargodao = cargodao;
    }

    public CidadeDao getCidadedao() {
        return cidadedao;
    }

    public void setCidadedao(CidadeDao cidadedao) {
        this.cidadedao = cidadedao;
    }

    public EstadoDao getEstadodao() {
        return estadodao;
    }

    public void setEstadodao(EstadoDao estadodao) {
        this.estadodao = estadodao;
    }

    public FuncionarioDao getFuncionariodao() {
        return funcionariodao;
    }

    public void setFuncionariodao(FuncionarioDao funcionariodao) {
        this.funcionariodao = funcionariodao;
    }

    public Funcionario getExcluido() {
        return excluido;
    }

    public void setExcluido(Funcionario excluido) {
        this.excluido = excluido;
    }

    public Funcionario getFuncionario() {
        return funcionario;
    }

    public void setFuncionario(Funcionario funcionario) {
        this.funcionario = funcionario;
    }

    public long getIdCargo() {
        return idCargo;
    }

    public void setIdCargo(long idCargo) {
        this.idCargo = idCargo;
    }

    public long getIdCidade() {
        return idCidade;
    }

    public void setIdCidade(long idCidade) {
        this.idCidade = idCidade;
    }

    public long getIdEstado() {
        return idEstado;
    }

    public void setIdEstado(long idEstado) {
        this.idEstado = idEstado;
    }

    public List<Funcionario> getListafuncionario() {
        return listafuncionario;
    }

    public void setListafuncionario(List<Funcionario> listafuncionario) {
        this.listafuncionario = listafuncionario;
    }

    public String salvar() {
        funcionario.setFunCargo(cargodao.pesquisar(idCargo));
        funcionario.setFunCidade(cidadedao.pesquisar(idCidade));
        funcionario.setFunEstado(estadodao.pesquisar(idEstado));
        funcionariodao.inserir(funcionario);
        funcionario = new Funcionario();
        cancelar();
        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "CONFIRMAÇÃO",
                "Cadastrado realizado com sucesso!"));
        return "CadastroFuncionario.xhtml";
    }

    public List<Funcionario> listafuncionario() {
        return listafuncionario = funcionariodao.getAll();
    }

    public String removerfuncionario(Funcionario obj) {
        try {
            funcionariodao.excluir(obj);
            cancelar();
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "CONFIRMAÇÃO", "Registro removido com sucesso!"));
        } catch (RollbackException e) {
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL,
                    "ATENÇÃO", "Registro já esta em uso, não pode ser removido."));
        }
        return "CadastroFuncionario.xhtml";
    }

    public void parametroRemover(ActionEvent event) {
        UIComponent link = event.getComponent();
        UIParameter param = (UIParameter) link.findComponent("idParaRemover");
        excluido = (Funcionario) param.getValue();
    }

    public void remover() {
        removerfuncionario(excluido);
        excluido = null;
    }

    public void alterar(Funcionario obj) {
        idCidade = obj.getFunCidade().getCidCodigo();
        idEstado = obj.getFunEstado().getEstCodigo();
        idCargo = obj.getFunCargo().getCarCodigo();
        obj = funcionariodao.pesquisar(obj.getFunCodigo());
        this.funcionario = obj;
    }

    public String cancelar() {
        idCargo = 0L;
        idCidade = 0L;
        idEstado = 0L;
        funcionario = new Funcionario();
        return "CadastroFuncionario.xhtml";
    }

    public String paginaEstado() {
        return "CadastroEstado.xhtml";
    }

    public String paginaCidade() {
        return "CadastroCidade.xhtml";
    }

    public String paginaCargo() {
        return "CadastroCargo.xhtml";
    }
    private List<Cidade> cidades = new ArrayList<>();
    private Estado estado = new Estado();

    public List<Cidade> getCidades() {
        return cidades;
    }

    public void popularCidades() {
        cidades = estadodao.pesquisar(idEstado).getCidades();
        System.out.println("estado:" + estado.getEstDescricao());
        System.out.println("Cidade:" + cidades.get(0).getCidDescricao());

    }
}
